package com.leyou.sms.utils;

import com.gitee.yongzhuzl.commonutil.util.equals.EqualsUtil;
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.leyou.sms.config.SmsTxyProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * description: 发送腾讯云短信工具类
 * @author 朱正磊
 * @date 2021-04-15 20:03:42
 */
@Slf4j
@Component
public class SmsTxyUtils {

    @Resource
    private SmsTxyProperties smsTxyProperties;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 短信手机号前缀
     */
    private static final String KEY_PREFIX = "sms:phone:";

    /**
     * 连续给同一个人发送同一种短信最短时间间隔（ms）
     */
    private static final Long SMS_MIN_INTERVAL_IN_MILLIS = 60 * 1000L;

    /**
     * description: 发送腾讯云短信
     * @author 朱正磊
     * @date 2021-04-15 22:13:52
     * @param phoneNumber 手机号码
     * @param smsSign 签名
     * @param templateId 模板id
     * @param params 模板参数
     */
    public void sendSmsTxy(String phoneNumber, String smsSign, Integer templateId, String[] params) {
        String key = KEY_PREFIX + phoneNumber;
        // 根据手机号码进行限流
        String lastTime = stringRedisTemplate.opsForValue().get(key);
        if (StringUtils.isNotBlank(lastTime)) {
            Long last = Long.valueOf(lastTime);
            if (System.currentTimeMillis() - last < SMS_MIN_INTERVAL_IN_MILLIS) {
                // 如果上次距本次发送短信不足1分钟，则不允许发送本次短信
                log.info("【短信微服务】发送腾讯云短信频率过高，被阻止，手机号码：{}", phoneNumber);
                return;
            }
        }
        try {
            SmsSingleSender sender = new SmsSingleSender(smsTxyProperties.getSdkAppid(), smsTxyProperties.getSdkAppkey());
            SmsSingleSenderResult senderResult = sender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");
            if (EqualsUtil.isNotEquals(0, senderResult.result)) {
                log.info("【短信微服务】发送腾讯云短信失败，手机号码：{}，原因：{}", phoneNumber, senderResult.errMsg);
            }

            // 记录发送短信日志
            log.info("【短信微服务】成功发送腾讯云短信验证码，手机号码：{}", phoneNumber);

            // 发送验证码短信成功之后，写入redis，key为手机号码，value为当前时间
            // 指定生存时间为1分钟
            String value = String.valueOf(System.currentTimeMillis());
            stringRedisTemplate.opsForValue().set(key, value, 1, TimeUnit.MINUTES);
        } catch (Exception e) {
            log.error("【短信微服务】发送腾讯云短信异常，手机号码：{}", phoneNumber, e);
        }
    }

}
